home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet internetowy / Rozne / HTTrack 3.40-2 / httrack-3.40-2.exe / {app} / src_win / WinHTTrackIEBar / WinHTTrackLauncher.cpp < prev    next >
C/C++ Source or Header  |  2004-02-15  |  6KB  |  229 lines

  1. // WinHTTrackLauncher.cpp : Implementation of CWinHTTrackIEBarApp and DLL registration.
  2.  
  3. #include "stdafx.h"
  4. #include "WinHTTrackIEBar.h"
  5. #include "WinHTTrackLauncher.h"
  6.  
  7. extern "C" {
  8. #include <direct.h>
  9. };
  10.  
  11. #include <commctrl.h>
  12. #include <mshtml.h>
  13.  
  14. #include "projectInfo.h"
  15.  
  16. /////////////////////////////////////////////////////////////////////////////
  17. //
  18.  
  19. static char* BSTRtoPCHAR(BSTR str, UINT codepage = CP_ACP) {
  20.   if (str != NULL) {
  21.       int multiByteLength = ::WideCharToMultiByte( codepage, 0, str, wcslen(str), NULL, NULL, NULL, NULL); 
  22.     if (multiByteLength > 0) 
  23.     { 
  24.       char *pcharMutiByteBuffer = (char*) malloc(multiByteLength + 1); 
  25.       ::WideCharToMultiByte( codepage, 0, str, wcslen(str), pcharMutiByteBuffer, multiByteLength, NULL, NULL); 
  26.       pcharMutiByteBuffer[multiByteLength] = '\0';
  27.       return pcharMutiByteBuffer;
  28.     }
  29.   }
  30.   return NULL;
  31. }
  32.  
  33. static int fexist(char* s) {
  34.   FILE* fp = fopen(s, "rb");
  35.   if (fp) fclose(fp);
  36.   return fp != NULL;
  37.  
  38. STDMETHODIMP WinHTTrackLauncher::InterfaceSupportsErrorInfo(REFIID riid)
  39. {
  40.   static const IID* arr[] = 
  41.   {
  42.     &IID_IWinHTTrackLauncher,
  43.   };
  44.   
  45.   for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
  46.   {
  47.     if (InlineIsEqualGUID(*arr[i],riid))
  48.       return S_OK;
  49.   }
  50.   return S_FALSE;
  51. }
  52.  
  53. // IOleCommandTarget
  54. STDMETHODIMP WinHTTrackLauncher::QueryStatus(const GUID __RPC_FAR *pguidCmdGroup, ULONG cCmds, OLECMD __RPC_FAR prgCmds[  ], OLECMDTEXT __RPC_FAR *pCmdText) {
  55.     HRESULT hr = E_POINTER;
  56.  
  57.     if ( prgCmds != NULL)
  58.     {
  59.         for ( ULONG i = 0; i < cCmds; i++)
  60.             prgCmds[i].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; 
  61.         
  62.         hr = S_OK;
  63.     }
  64.     return hr;
  65. }
  66.  
  67. STDMETHODIMP WinHTTrackLauncher::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut) {
  68.   HKEY key;
  69.   DWORD type;
  70.   char path[256];
  71.   char appPath[256];
  72.   DWORD size = sizeof(path) - 2;
  73.   BSTR url = NULL;
  74.   BSTR title = NULL;
  75.   char* urlPCHAR = NULL;
  76.   char* titlePCHAR = NULL;
  77.  
  78.   if (RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\WinHTTrack Website Copier\\WinHTTrack Website Copier\\DefaultValues",
  79.     0, KEY_READ,
  80.     &key) == ERROR_SUCCESS) {
  81.     if (RegQueryValueExA(key, "BasePath", 0, &type,
  82.       (LPBYTE) path, &size) == ERROR_SUCCESS)
  83.     {
  84.       path[size] = '\0';
  85.     }
  86.     RegCloseKey(key);
  87.   }
  88.   size = sizeof(appPath) - 2;
  89.   if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\WinHTTrack Website Copier\\WinHTTrack Website Copier",
  90.     0, KEY_READ,
  91.     &key) == ERROR_SUCCESS) {
  92.     if (RegQueryValueExA(key, "Path", 0, &type,
  93.       (LPBYTE) appPath, &size) == ERROR_SUCCESS)
  94.     {
  95.       appPath[size] = '\0';
  96.       strcat(appPath, "\\WinHTTrack.exe");
  97.     }
  98.     RegCloseKey(key);
  99.   }
  100.   
  101.   if (path[0] != '\0' && appPath[0] != '\0') {
  102.  
  103.     CComPtr<IDispatch> doc;
  104.     if (SUCCEEDED(browser->get_Document(&doc))) {
  105.       CComQIPtr<IHTMLDocument2> hDoc(doc);
  106.       if (hDoc != NULL) {
  107.         if (SUCCEEDED(hDoc->get_title(&title))) {
  108.           titlePCHAR = BSTRtoPCHAR(title);
  109.         }
  110.       }
  111.     }
  112.     if (SUCCEEDED(browser->get_LocationURL(&url))) {
  113.       urlPCHAR = BSTRtoPCHAR(url);
  114.     }
  115.     
  116.     if (urlPCHAR != NULL && titlePCHAR != NULL) {
  117.       int i, j;     
  118.       char lastCh = 0;
  119.       for(i = 0 ; i < (int) strlen(titlePCHAR) ; i++) {
  120.         if (titlePCHAR[i] == '\"') {
  121.           titlePCHAR[i] = '\'';
  122.         }
  123.         else if (titlePCHAR[i] == ',' 
  124.           || titlePCHAR[i] == '~'
  125.           || titlePCHAR[i] == '\\'
  126.           || titlePCHAR[i] == '/'
  127.           || titlePCHAR[i] == ':'
  128.           || titlePCHAR[i] == '*'
  129.           || titlePCHAR[i] == '?'
  130.           || titlePCHAR[i] == '<'
  131.           || titlePCHAR[i] == '>'
  132.           || titlePCHAR[i] == '|'
  133.           || ((unsigned char)titlePCHAR[i]) < 32
  134.           ) {
  135.               titlePCHAR[i] = ' ';
  136.           }
  137.       }
  138.       for(i = 0, j = 0 ; titlePCHAR[i] != '\0' ; i++) {
  139.           if (titlePCHAR[i] != ' ' || lastCh != ' ') {
  140.               if (i != j) {
  141.                   titlePCHAR[j++] = titlePCHAR[i];
  142.               }
  143.               lastCh = titlePCHAR[i];
  144.           }
  145.       }
  146.       titlePCHAR[j++] = '\0';
  147.       if (strlen(titlePCHAR) > 128)
  148.           titlePCHAR[128] = '\0';
  149.  
  150.       _bstr_t titleWtl = titlePCHAR;
  151.       CprojectInfo info(&titleWtl);
  152.       if (info.DoModal() == IDOK) {
  153.           /* Form name */
  154.           strcat(path, "\\");
  155.           strcat(path, (char*)titleWtl);
  156.           int backPos = strlen(path);
  157.           strcat(path, ".whtt");
  158.           /* Open */
  159.           if (!fexist(path)) {
  160.               FILE* fp = fopen(path, "wb");
  161.               if (fp != NULL) {
  162.                   fclose(fp);
  163.               }
  164.               path[backPos] = '\0';
  165.               _mkdir(path);
  166.               strcat(path, "\\hts-cache");
  167.               _mkdir(path);
  168.               strcat(path, "\\winprofile.ini");
  169.               fp = fopen(path, "wb");
  170.               if (fp != NULL) {
  171.                   fprintf(fp, "CurrentUrl=%s\r\n", urlPCHAR);
  172.                   fprintf(fp, "CurrentAction=1\r\n");
  173.                   fclose(fp);
  174.               }
  175.               path[backPos] = '\0';
  176.               strcat(path, ".whtt");
  177.           }
  178.           if (fexist(path)) {       
  179.               if (!ShellExecuteA(NULL, "open", path, "", "", SW_RESTORE)) {
  180.               }
  181.           }
  182.       }
  183.  
  184.     } else
  185.       MessageBox(NULL, L"Can not find any URL", L"WinHTTrack", MB_SETFOREGROUND);
  186.   }
  187.   if (url != NULL) {
  188.     SysFreeString(url);
  189.   }   
  190.   if (title != NULL) {
  191.     SysFreeString(title);
  192.   }
  193.   if (urlPCHAR != NULL) {
  194.     free(urlPCHAR);
  195.   }
  196.   if (titlePCHAR != NULL) {
  197.     free(titlePCHAR);
  198.   }
  199.   return S_OK;
  200. }
  201.  
  202. // IObjectWithSite - See KB257717
  203. STDMETHODIMP WinHTTrackLauncher::SetSite(IUnknown* pClientSite) {
  204.   HRESULT hr = S_OK;
  205.   CComPtr<IServiceProvider> isp, isp2;
  206.   if (pClientSite != NULL)
  207.   {
  208.     if (SUCCEEDED(pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>(&isp))))
  209.     {
  210.       if (SUCCEEDED(isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void **>(&isp2))))
  211.       {
  212.         if (SUCCEEDED(isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void **>(&browser))))
  213.         {
  214.         }
  215.       }
  216.     }
  217.   }
  218.   return S_OK;
  219. }
  220.  
  221. STDMETHODIMP WinHTTrackLauncher::GetSite(REFIID riid, void** ppvSite) {
  222.     if (NULL != ppvSite) {
  223.         *ppvSite = browser;
  224.     }
  225.     return E_NOTIMPL;
  226. }
  227.  
  228.